#ifndef __WINOGRAD_36_TO_4x4_H
#define __WINOGRAD_36_TO_4x4_H

#include "operation.h"

namespace mslite {

class Winograd36To4x4: public Operation {
public:
    Winograd36To4x4(cl_context context, cl_device_id device, std::string clKernelName, std::vector<int> ishape, std::vector<int> oshape);
    virtual ~Winograd36To4x4() = default;
    cl_int prepareMem(void) override;
    cl_int setParams(void) override;
    // cl_int getOutut(cl_command_queue commandQueue, std::vector<std::vector<float>> &output) override;
};

class Winograd36To4x4Naive: public Winograd36To4x4 {
public:
    Winograd36To4x4Naive(cl_context context, cl_device_id device, std::vector<int> ishape, std::vector<int> oshape);
    virtual ~Winograd36To4x4Naive() = default;
    cl_int bind(void) override;
};

class Winograd36To4x4Tflite: public Winograd36To4x4 {
public:
    Winograd36To4x4Tflite(cl_context context, cl_device_id device, std::vector<int> ishape, std::vector<int> oshape);
    virtual ~Winograd36To4x4Tflite() = default;
    cl_int bind(void) override;
};

class Winograd36To4x4Image2d: public Winograd36To4x4 {
public:
    Winograd36To4x4Image2d(cl_context context, cl_device_id device, std::vector<int> ishape, std::vector<int> oshape);
    virtual ~Winograd36To4x4Image2d() = default;
    cl_int prepareMem(void) override;
    cl_int bind(void) override;
};

}

#endif